/*
 * @PageName:
 * @Description:
 * @FilePath: /glm-mes-pc/src/permission.js
 */
import router from './router'
import { ElMessage } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isHttp } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
import usePermissionStore from '@/store/modules/permission'

NProgress.configure({ showSpinner: false })

// 白名单
const whiteList = ['/login', '/force-reset-password', '/forgot-password']

router.beforeEach((to, from, next) => {
	NProgress.start()
	const token = getToken()
	/* 有token */
	if (token) {
		to.meta.title && useSettingsStore().setTitle(to.meta.title)
		// 已登录的,重定向到首页
		if (whiteList.find((item) => item === to.path)) {
			next({ path: '/' })
			NProgress.done()
		} else {
			if (useUserStore().roles.length === 0) {
				isRelogin.show = true
				// 获取部门列表供样品销售订单使用
				useUserStore().getDeptList()
				// 判断当前用户是否已拉取完user_info信息
				useUserStore()
					.getInfo()
					.then(() => {
						isRelogin.show = false
						usePermissionStore()
							.generateRoutes()
							.then((accessRoutes) => {
								// 根据roles权限生成可访问的路由表
								accessRoutes.forEach((route) => {
									if (!isHttp(route.path)) {
										// 动态添加可访问路由表
										router.addRoute(route)
									}
								})
								// hack方法 确保addRoutes已完成
								next({ ...to, replace: true })
							})
					})
					.catch((err) => {
						useUserStore()
							.logOut()
							.then(() => {
								ElMessage.error(err)
								next({ path: '/' })
							})
					})
			} else {
				next()
			}
		}
	} else {
		/* 没有token */
		// 在免登录白名单，直接进入
		if (whiteList.indexOf(to.path) !== -1) {
			next()
		} else {
			// 否则全部重定向到登录页
			next(`/login?redirect=${to.fullPath}`)
			NProgress.done()
		}
	}
})

/* 直接到首页 */
// router.beforeEach((to, from, next) => {
// 	NProgress.start()
// 	next()
// })

router.afterEach(() => {
	NProgress.done()
})
